package m.html.list;

import m.html.element.Element;
import m.html.element.Text;
import m.html.element.attr.TagColor;
import m.html.element.other.IElement;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ListElement extends Element implements IListElement {

	/**
	 * 列表行内判断  {text, record, index} 当前列字段，行记录，行
	 *  test 表达式   例如:text=='1'
	 */
	public static ListElement test(String test,IListElement... e) {
		return new ListElement("template").addAttr("v-if", test).addElement(e);
	}
	/** 需配合 test
	 * 列表行内判断  {text, record, index} 当前列字段，行记录，行
	 *  test  表达式   例如:text=='1'
	 */
	public static ListElement elseTest(String test,IListElement... e) {
		return new ListElement("template").addAttr("v-else-if", test).addElement(e);
	}
	/** 需配合 test 或者 elseTest
	 * 列表行内判断  {text, record, index} 当前列字段，行记录，行
	 *  test  表达式   例如:text=='1'
	 */
	public static ListElement elseOther(IListElement... e) {
		return new ListElement("template").addAttr("v-else").addElement(e);
	}
	
	public ListElement(String tagName) {
		super(tagName);
	}

	/**
	 * 常用组件 tooltip
	 */
	public static ListElement tooltip(String title,IListElement... e){
		return new ListElement("a-tooltip")
			.addElement(new ListElement("template").addAttr("#title").addText(title))
			.addElement(e);
	}
	/**
	 * 常用组件 tag
	 */
	public static ListElement tag(String text,String color){
		return tag(text,color,true);
	}
	/**
	 * 常用组件 tag
	 */
	public static ListElement tag(String text,String color,boolean border){
		return new ListElement("a-tag").addAttr("color",color).addAttr(":bordered", String.valueOf(border)).addText(text);
	}
	private static String toDecode(String dataKey,Map<String, TagColor> colorMap){
		StringBuilder sb=new StringBuilder("decode(").append(dataKey);
		for(String key :colorMap.keySet()) sb.append(",'").append(key).append("','").append(colorMap.get(key)).append("'");
		sb.append(",'").append(TagColor.Default).append("')");
		return sb.toString();
	}
	/**
	 * 常用组件 tag   内容使用text属性,表格使用
	 */
	public static ListElement tag(String dict,Map<String, TagColor> colorMap, boolean border){
		return tag("text",dict,colorMap,border);
	}
	/**
	 * 常用组件 tag   dataKey：表格中使用record.xxxx，表单中使用data属性
	 */
	public static ListElement tag(String dataKey,String dict, Map<String, TagColor> colorMap, boolean border){
		if(!dict.startsWith("'")) dict="'"+dict+"'";
		String text="{{dict("+dict+","+dataKey+")}}";
		return new ListElement("a-tag").addAttr(":color",toDecode(dataKey,colorMap)).addAttr(":bordered", String.valueOf(border)).addText(text);
	}
	/**
	 * 常用组件 a-badge 点模式 内容使用text属性
	 */
	public static ListElement dot(String dict, Map<String, TagColor> colorMap){
		return dot("text",dict,colorMap);
	}
	/**
	 * 常用组件 a-badge   dataKey：表格中使用record.xxxx，表单中使用data属性
	 */
	public static ListElement dot(String dataKey,String dict, Map<String, TagColor> colorMap){
		if(!dict.startsWith("'")) dict="'"+dict+"'";
		String text="dict("+dict+","+dataKey+")";
		return new ListElement("a-badge").addAttr(":status",toDecode(dataKey,colorMap))
				.addAttr(":color",toDecode(dataKey,colorMap)).addAttr(":text",text);
	}
	/**
	 * 常用组件 a-badge 点模式
	 */
	public static ListElement dot(String statusText,String color){
		return new ListElement("a-badge").addAttr("color",color).addAttr("text",statusText);
	}

	/**
	 * 获取参数所需的字段
	 * 
	 */
	public Set<String> getParamFields() {
		Set<String> pf= new HashSet<>();
		if(null!=this.event) pf.addAll(this.event.getParamFields());
		for(IElement ele : this.getChilds()) {
			if(ele instanceof IListElement) {
				pf.addAll(((IListElement)ele).getParamFields());
			}
		}
		return pf;
	}
	/**
	 * 添加子元素
	 *  element
	 * 
	 */
	public ListElement addElement(IListElement... element) {
		super.E(element);
		return this;
	}
	public ListElement addText(String text) {
		super.E(new Text(text));
		return this;
	}
	public ListElement addAttr(String name) {
		super.A(name);
		return this;
	}
	public ListElement addAttr(String name,String value) {
		super.A(name, value);
		return this;
	}
	private ListEvent event;//事件
	@Override
	public ListEvent getEvent() {
		return event;
	}
	public ListElement setEvent(ListEvent event) {
		this.event=event;
		this.setExtend(event.toExtendString());
		return this;
	}

}
